package polymorphic_package3;

public class Test {
    public static void main(String[] args) {
        //创建对象
        Animal a = new Dog();
        //编译看左边，运行看右边
        a.eat();

        //多态弊端:
        //不能调用子类的特有功能

        //解决方案：
        //变回子类类型即可
        Dog d = (Dog) a;
        d.lookHome();

//        if (a instanceof Dog) {
//            Dog d1 = (Dog) a;
//            d1.lookHome();
//        } else if (a instanceof Cat) {
//            Cat c = (Cat) a;
//            c.catchMouse();
//        } else{
//            System.out.println("没有这个类型，无法转换");
//        }

        //新特性
        //先判断a是否是Dog类型，如果是，则强转成Dog类型，转换之后变量名为d1
        //如果不是，则不强转，结果直接是false
        if (a instanceof Dog d1) {
            d1.lookHome();
        } else if (a instanceof Cat c) {
            c.catchMouse();
        } else{
            System.out.println("没有这个类型，无法转换");
        }
    }
}

class Animal {
    public void eat() {
        System.out.println("动物在吃东西");
    }
}

class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }

    public void lookHome() {
        System.out.println("狗看家");
    }
}

class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃小鱼干");
    }

    public void catchMouse() {
        System.out.println("猫抓老鼠");
    }
}